{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "r2dfGLNrTmHv"
   },
   "source": [
    "# Training a Simple GAN with PyTorch\n",
    "- GAN for Generating simple MNIST Images\n",
    "- Good to have a GPU for faster training"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "id": "k0IOFO4DUw06"
   },
   "outputs": [],
   "source": [
    "!rm -r track\n",
    "!mkdir track"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "id": "4YxqP7LbiUrv"
   },
   "outputs": [],
   "source": [
    "# Torch Imports\n",
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.optim as optim\n",
    "import torch.nn.functional as F\n",
    "\n",
    "# Torchvision Imports\n",
    "from torchvision import datasets, transforms\n",
    "from torchvision.utils import save_image\n",
    "\n",
    "# Device configuration; Good to have a GPU for GAN Training\n",
    "device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "K5f7nyCDieqA",
    "outputId": "3a929414-8d0a-4d40-81be-8d4850709d01"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "device(type='cuda')"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "device"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "SbdcNZOHTUgM"
   },
   "source": [
    "# Generator Network\n",
    "- 4 Fully Connected Layers\n",
    "- Output Dimension will be same as 28*28"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "id": "lYTu38GFik4Z"
   },
   "outputs": [],
   "source": [
    "class Generator(nn.Module):\n",
    "    def __init__(self, g_input_dim, g_output_dim):\n",
    "        super(Generator, self).__init__()\n",
    "        self.fc1 = nn.Linear(g_input_dim, 256)\n",
    "        self.fc2 = nn.Linear(256, 512)\n",
    "        self.fc3 = nn.Linear(512, 1024)\n",
    "        self.fc4 = nn.Linear(1024, g_output_dim)\n",
    "\n",
    "\n",
    "    # forward method\n",
    "    def forward(self, x):\n",
    "        x = F.leaky_relu(self.fc1(x), negative_slope=0.2)\n",
    "        x = F.leaky_relu(self.fc2(x), negative_slope=0.2)\n",
    "        x = F.leaky_relu(self.fc3(x), negative_slope=0.2)\n",
    "        return torch.tanh(self.fc4(x))\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "G-JIxeU0TcyI"
   },
   "source": [
    "# Discriminator Network\n",
    "- 4 Fully Connected Layers\n",
    "- Output is a Single Neuron, 1=Real Image, 0=Fake Image"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "id": "Is-ZNi1tio-_"
   },
   "outputs": [],
   "source": [
    "class Discriminator(nn.Module):\n",
    "    def __init__(self, d_input_dim):\n",
    "        super(Discriminator, self).__init__()\n",
    "        self.fc1 = nn.Linear(d_input_dim, 1024)\n",
    "        self.fc2 = nn.Linear(1024, 512)\n",
    "        self.fc3 = nn.Linear(512, 256)\n",
    "        self.fc4 = nn.Linear(256, 1)\n",
    "\n",
    "    # forward method\n",
    "    def forward(self, x):\n",
    "        x = F.leaky_relu(self.fc1(x), negative_slope=0.2)\n",
    "        x = F.leaky_relu(self.fc2(x), negative_slope=0.2)\n",
    "        x = F.leaky_relu(self.fc3(x), negative_slope=0.2)\n",
    "        return self.fc4(x)\n",
    "        # return torch.sigmoid(self.fc4(x))\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "nvYTEfyMTJKV"
   },
   "source": [
    "# Instantiating Models\n",
    "- Using a random noise of 100 dimensions\n",
    "- Using BCE Loss for Training\n",
    "- Using Adam Optimizer for Training"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "id": "6oesO7aEnZu3"
   },
   "outputs": [],
   "source": [
    "# Models\n",
    "z_dim = 100 # Dimension of the Input Noise to the Generator\n",
    "mnist_dim = 28 * 28 # As we have 28x28 pixel images in MNIST\n",
    "G = Generator(g_input_dim = z_dim, g_output_dim = mnist_dim).to(device)\n",
    "D = Discriminator(mnist_dim).to(device)\n",
    "\n",
    "# loss\n",
    "# criterion = nn.BCELoss()\n",
    "\n",
    "# optimizer\n",
    "lr = 0.00005\n",
    "G_optimizer = optim.RMSprop(G.parameters(), lr = lr)\n",
    "D_optimizer = optim.RMSprop(D.parameters(), lr = lr)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "MQD5--pkTCwi"
   },
   "source": [
    "# Loading & Normalizing MNIST Dataset"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "id": "Mi4nn196i4bi"
   },
   "outputs": [],
   "source": [
    "# Batch Size for Training\n",
    "batch_size = 32\n",
    "\n",
    "# Transforming Images to Tensor and then Normalizing the values to be between 0 and 1, with mean 0.5 and std 0.5\n",
    "transform = transforms.Compose([\n",
    "    transforms.ToTensor(),\n",
    "    transforms.Normalize(mean=(0.5,), std=(0.5,))])\n",
    "\n",
    "# Loading the Training Dataset and applying Transformation\n",
    "train_dataset = datasets.MNIST(root='./mnist/', train=True, transform=transform, download=True)\n",
    "test_dataset = datasets.MNIST(root='./mnist/', train=False, transform=transform, download=False)\n",
    "\n",
    "# Data Loader which will be used as input to the models.\n",
    "train_loader = torch.utils.data.DataLoader(dataset=train_dataset, batch_size=batch_size, shuffle=True)\n",
    "test_loader = torch.utils.data.DataLoader(dataset=test_dataset, batch_size=batch_size, shuffle=False)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "uG5014WuTANh"
   },
   "source": [
    "# Method for Training Discriminator"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "id": "RZkoCFbQi8Et"
   },
   "outputs": [],
   "source": [
    "def train_discriminator(mnist_data_batch):\n",
    "    #===================Discriminator-Trainer===================#\n",
    "    D.zero_grad()\n",
    "\n",
    "    # train discriminator on real\n",
    "    x_real, y_real = mnist_data_batch.view(-1, mnist_dim), torch.ones(batch_size, 1)\n",
    "    x_real, y_real = x_real.to(device), y_real.to(device)\n",
    "\n",
    "    # Loss for Real MNIST Data\n",
    "    D_output = D(x_real).reshape(-1)\n",
    "    D_real_loss = D_output.mean()\n",
    "\n",
    "    # Generate Data from Generator Network for Training\n",
    "    z = torch.randn(batch_size, z_dim).to(device) # Random Noise as Input to G\n",
    "    x_fake, y_fake = G(z), torch.zeros(batch_size, 1).to(device)\n",
    "\n",
    "    # Loss for Fake Data from Generator\n",
    "    D_output = D(x_fake).reshape(-1)\n",
    "    D_fake_loss = D_output.mean()\n",
    "\n",
    "    # Updating only D's weights, so training on D on total loss\n",
    "    D_loss = -D_real_loss + D_fake_loss\n",
    "    D_loss.backward()\n",
    "    D_optimizer.step()\n",
    "\n",
    "    return  D_loss.data.item()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "svYCG8BRS8Go"
   },
   "source": [
    "# Method for Training Generator"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "id": "5_ZOsm6zjAj5"
   },
   "outputs": [],
   "source": [
    "def train_generator():\n",
    "    #=======================Generator-Trainer=======================#\n",
    "    G.zero_grad()\n",
    "\n",
    "    # Generate Random Noise to use as Input to the Generator\n",
    "    z = torch.randn(batch_size, z_dim).to(device)\n",
    "    # The final label in this case in 1(True), i.e the Discriminator Model\n",
    "    # Thinks these are real images therefore the losses for Generator\n",
    "    # Network should update the weights of G in such a way that it produces more\n",
    "    # Real looking images.\n",
    "    y = torch.ones(batch_size, 1).to(device)\n",
    "\n",
    "    # Generate Images\n",
    "    G_output = G(z)\n",
    "    # Get output from Discriminator for the Generated Images\n",
    "    D_output = D(G_output).reshape(-1)\n",
    "    # Compute Loss\n",
    "    G_loss = -D_output.mean()\n",
    "\n",
    "    # Updating only G's weights\n",
    "    G_loss.backward()\n",
    "    G_optimizer.step()\n",
    "\n",
    "    return G_loss.data.item()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "M0zmaw4MS6bP"
   },
   "source": [
    "# Main Training Loop"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "BNEl9XfflU21",
    "outputId": "c2d9a3d3-fdd1-4e3c-866d-1ae00407ab0e"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0/200]: loss_d: -0.42203810811042786, loss_g: -1.0899877548217773\n",
      "[1/200]: loss_d: -0.3802225887775421, loss_g: -1.174957036972046\n",
      "[2/200]: loss_d: -0.3882812559604645, loss_g: -1.1123164892196655\n",
      "[3/200]: loss_d: -0.3479524850845337, loss_g: -0.9927830696105957\n",
      "[4/200]: loss_d: -0.3654922544956207, loss_g: -1.0938918590545654\n",
      "[5/200]: loss_d: -0.3397221863269806, loss_g: -0.9909398555755615\n",
      "[6/200]: loss_d: -0.3494056761264801, loss_g: -1.097383975982666\n",
      "[7/200]: loss_d: -0.3277183175086975, loss_g: -0.9904671907424927\n",
      "[8/200]: loss_d: -0.3367430567741394, loss_g: -0.9880886673927307\n",
      "[9/200]: loss_d: -0.31739485263824463, loss_g: -1.0783188343048096\n",
      "[10/200]: loss_d: -0.31903740763664246, loss_g: -0.9771227240562439\n",
      "[11/200]: loss_d: -0.33111464977264404, loss_g: -1.0676960945129395\n",
      "[12/200]: loss_d: -0.32714739441871643, loss_g: -1.0699108839035034\n",
      "[13/200]: loss_d: -0.3294054865837097, loss_g: -1.069718360900879\n",
      "[14/200]: loss_d: -0.320415735244751, loss_g: -1.0238807201385498\n",
      "[15/200]: loss_d: -0.321056067943573, loss_g: -1.0876070261001587\n",
      "[16/200]: loss_d: -0.3153224289417267, loss_g: -1.0967609882354736\n",
      "[17/200]: loss_d: -0.3150748014450073, loss_g: -1.048874020576477\n",
      "[18/200]: loss_d: -0.31422552466392517, loss_g: -1.0415146350860596\n",
      "[19/200]: loss_d: -0.31182000041007996, loss_g: -1.0417309999465942\n",
      "[20/200]: loss_d: -0.31275472044944763, loss_g: -1.0152090787887573\n",
      "[21/200]: loss_d: -0.2965129613876343, loss_g: -1.0808231830596924\n",
      "[22/200]: loss_d: -0.2895539104938507, loss_g: -1.0299547910690308\n",
      "[23/200]: loss_d: -0.29118743538856506, loss_g: -0.9727743268013\n",
      "[24/200]: loss_d: -0.29042771458625793, loss_g: -0.990781843662262\n",
      "[25/200]: loss_d: -0.29151707887649536, loss_g: -1.1671929359436035\n",
      "[26/200]: loss_d: -0.2937113642692566, loss_g: -1.095849871635437\n",
      "[27/200]: loss_d: -0.291727215051651, loss_g: -1.1424169540405273\n",
      "[28/200]: loss_d: -0.29539063572883606, loss_g: -1.1271346807479858\n",
      "[29/200]: loss_d: -0.3029225170612335, loss_g: -1.2254687547683716\n",
      "[30/200]: loss_d: -0.3007112741470337, loss_g: -1.4495563507080078\n",
      "[31/200]: loss_d: -0.2974427342414856, loss_g: -1.184179425239563\n",
      "[32/200]: loss_d: -0.281755268573761, loss_g: -1.2188962697982788\n",
      "[33/200]: loss_d: -0.27862656116485596, loss_g: -1.0624891519546509\n",
      "[34/200]: loss_d: -0.2694110870361328, loss_g: -1.18491530418396\n",
      "[35/200]: loss_d: -0.27631089091300964, loss_g: -1.0550285577774048\n",
      "[36/200]: loss_d: -0.2751443088054657, loss_g: -1.0662386417388916\n",
      "[37/200]: loss_d: -0.2746039032936096, loss_g: -1.0509371757507324\n",
      "[38/200]: loss_d: -0.2782769501209259, loss_g: -1.2186964750289917\n",
      "[39/200]: loss_d: -0.2767876982688904, loss_g: -1.1421669721603394\n",
      "[40/200]: loss_d: -0.26543986797332764, loss_g: -1.0972052812576294\n",
      "[41/200]: loss_d: -0.2743037939071655, loss_g: -1.2038053274154663\n",
      "[42/200]: loss_d: -0.27849242091178894, loss_g: -1.144608736038208\n",
      "[43/200]: loss_d: -0.2687484920024872, loss_g: -1.2229875326156616\n",
      "[44/200]: loss_d: -0.26423779129981995, loss_g: -1.1365103721618652\n",
      "[45/200]: loss_d: -0.2734512686729431, loss_g: -1.1310949325561523\n",
      "[46/200]: loss_d: -0.2606101632118225, loss_g: -1.2414575815200806\n",
      "[47/200]: loss_d: -0.2709134817123413, loss_g: -1.2578425407409668\n",
      "[48/200]: loss_d: -0.26588064432144165, loss_g: -1.1628459692001343\n",
      "[49/200]: loss_d: -0.2619551718235016, loss_g: -1.1567885875701904\n",
      "[50/200]: loss_d: -0.263051837682724, loss_g: -1.048290491104126\n",
      "[51/200]: loss_d: -0.25250452756881714, loss_g: -1.1185839176177979\n",
      "[52/200]: loss_d: -0.2684624493122101, loss_g: -1.1727842092514038\n",
      "[53/200]: loss_d: -0.25479018688201904, loss_g: -1.289819359779358\n",
      "[54/200]: loss_d: -0.2572384476661682, loss_g: -1.2137995958328247\n",
      "[55/200]: loss_d: -0.2578164041042328, loss_g: -1.158955693244934\n",
      "[56/200]: loss_d: -0.2536953389644623, loss_g: -1.145235300064087\n",
      "[57/200]: loss_d: -0.2543547749519348, loss_g: -1.1185542345046997\n",
      "[58/200]: loss_d: -0.24210870265960693, loss_g: -1.211997628211975\n",
      "[59/200]: loss_d: -0.24415701627731323, loss_g: -1.2337291240692139\n",
      "[60/200]: loss_d: -0.2418535202741623, loss_g: -1.1615256071090698\n",
      "[61/200]: loss_d: -0.24081911146640778, loss_g: -1.1343499422073364\n",
      "[62/200]: loss_d: -0.24233387410640717, loss_g: -1.145828127861023\n",
      "[63/200]: loss_d: -0.24515071511268616, loss_g: -1.2023277282714844\n",
      "[64/200]: loss_d: -0.23414453864097595, loss_g: -1.1886072158813477\n",
      "[65/200]: loss_d: -0.23325993120670319, loss_g: -1.1493067741394043\n",
      "[66/200]: loss_d: -0.2350737452507019, loss_g: -1.2366968393325806\n",
      "[67/200]: loss_d: -0.23076540231704712, loss_g: -1.0714069604873657\n",
      "[68/200]: loss_d: -0.22841525077819824, loss_g: -1.0970542430877686\n",
      "[69/200]: loss_d: -0.2319987416267395, loss_g: -1.1473743915557861\n",
      "[70/200]: loss_d: -0.22398556768894196, loss_g: -1.2485990524291992\n",
      "[71/200]: loss_d: -0.22346678376197815, loss_g: -1.1167601346969604\n",
      "[72/200]: loss_d: -0.2203466296195984, loss_g: -1.1147314310073853\n",
      "[73/200]: loss_d: -0.22021900117397308, loss_g: -1.1784805059432983\n",
      "[74/200]: loss_d: -0.2197542041540146, loss_g: -1.2036628723144531\n",
      "[75/200]: loss_d: -0.21902760863304138, loss_g: -1.1433285474777222\n",
      "[76/200]: loss_d: -0.21669204533100128, loss_g: -1.2300856113433838\n",
      "[77/200]: loss_d: -0.21295520663261414, loss_g: -1.3295005559921265\n",
      "[78/200]: loss_d: -0.20983827114105225, loss_g: -1.297871708869934\n",
      "[79/200]: loss_d: -0.21529221534729004, loss_g: -1.1857490539550781\n",
      "[80/200]: loss_d: -0.2080560326576233, loss_g: -1.3473140001296997\n",
      "[81/200]: loss_d: -0.20857864618301392, loss_g: -1.184790015220642\n",
      "[82/200]: loss_d: -0.20303939282894135, loss_g: -1.1673563718795776\n",
      "[83/200]: loss_d: -0.2084387093782425, loss_g: -1.2389881610870361\n",
      "[84/200]: loss_d: -0.2049570530653, loss_g: -1.1829508543014526\n",
      "[85/200]: loss_d: -0.2020050585269928, loss_g: -1.1963824033737183\n",
      "[86/200]: loss_d: -0.2042670100927353, loss_g: -1.1374863386154175\n",
      "[87/200]: loss_d: -0.20286360383033752, loss_g: -1.2491298913955688\n",
      "[88/200]: loss_d: -0.1984347105026245, loss_g: -1.1034749746322632\n",
      "[89/200]: loss_d: -0.20382089912891388, loss_g: -1.2535983324050903\n",
      "[90/200]: loss_d: -0.1964639574289322, loss_g: -1.2643333673477173\n",
      "[91/200]: loss_d: -0.1934228539466858, loss_g: -1.2298495769500732\n",
      "[92/200]: loss_d: -0.19106152653694153, loss_g: -1.2154779434204102\n",
      "[93/200]: loss_d: -0.1886454075574875, loss_g: -1.130464792251587\n",
      "[94/200]: loss_d: -0.18733470141887665, loss_g: -1.2948753833770752\n",
      "[95/200]: loss_d: -0.19063502550125122, loss_g: -1.2356078624725342\n",
      "[96/200]: loss_d: -0.18454042077064514, loss_g: -1.189852237701416\n",
      "[97/200]: loss_d: -0.18555113673210144, loss_g: -1.2016546726226807\n",
      "[98/200]: loss_d: -0.18050572276115417, loss_g: -1.1619518995285034\n",
      "[99/200]: loss_d: -0.17966914176940918, loss_g: -1.2317078113555908\n",
      "[100/200]: loss_d: -0.180189847946167, loss_g: -1.2009176015853882\n",
      "[101/200]: loss_d: -0.1846040040254593, loss_g: -1.193980097770691\n",
      "[102/200]: loss_d: -0.17927470803260803, loss_g: -1.0855964422225952\n",
      "[103/200]: loss_d: -0.18582256138324738, loss_g: -1.2196176052093506\n",
      "[104/200]: loss_d: -0.1741323471069336, loss_g: -1.1709861755371094\n",
      "[105/200]: loss_d: -0.17857763171195984, loss_g: -1.1355624198913574\n",
      "[106/200]: loss_d: -0.17513389885425568, loss_g: -1.1291208267211914\n",
      "[107/200]: loss_d: -0.17847652733325958, loss_g: -1.1427046060562134\n",
      "[108/200]: loss_d: -0.17372874915599823, loss_g: -1.2087550163269043\n",
      "[109/200]: loss_d: -0.16902120411396027, loss_g: -1.2003520727157593\n",
      "[110/200]: loss_d: -0.17280152440071106, loss_g: -1.1369590759277344\n",
      "[111/200]: loss_d: -0.1723828911781311, loss_g: -1.1113970279693604\n",
      "[112/200]: loss_d: -0.17402884364128113, loss_g: -1.1811977624893188\n",
      "[113/200]: loss_d: -0.16786785423755646, loss_g: -1.1632587909698486\n",
      "[114/200]: loss_d: -0.16364601254463196, loss_g: -1.2000508308410645\n",
      "[115/200]: loss_d: -0.16153347492218018, loss_g: -1.1465131044387817\n",
      "[116/200]: loss_d: -0.16594155132770538, loss_g: -1.1994184255599976\n",
      "[117/200]: loss_d: -0.16178549826145172, loss_g: -1.1586196422576904\n",
      "[118/200]: loss_d: -0.1647980958223343, loss_g: -1.1353278160095215\n",
      "[119/200]: loss_d: -0.1610279232263565, loss_g: -1.2603484392166138\n",
      "[120/200]: loss_d: -0.1639932543039322, loss_g: -1.2022560834884644\n",
      "[121/200]: loss_d: -0.1617431789636612, loss_g: -1.1313565969467163\n",
      "[122/200]: loss_d: -0.16172672808170319, loss_g: -1.265684962272644\n",
      "[123/200]: loss_d: -0.15956880152225494, loss_g: -1.2616446018218994\n",
      "[124/200]: loss_d: -0.15480263531208038, loss_g: -1.1401512622833252\n",
      "[125/200]: loss_d: -0.1565985381603241, loss_g: -1.2196133136749268\n",
      "[126/200]: loss_d: -0.15546230971813202, loss_g: -1.138385534286499\n",
      "[127/200]: loss_d: -0.15433137118816376, loss_g: -1.133744239807129\n",
      "[128/200]: loss_d: -0.15462112426757812, loss_g: -1.1450949907302856\n",
      "[129/200]: loss_d: -0.15479250252246857, loss_g: -1.1977771520614624\n",
      "[130/200]: loss_d: -0.15126214921474457, loss_g: -1.2534198760986328\n",
      "[131/200]: loss_d: -0.14935436844825745, loss_g: -1.1136729717254639\n",
      "[132/200]: loss_d: -0.1495431363582611, loss_g: -1.1282603740692139\n",
      "[133/200]: loss_d: -0.14780761301517487, loss_g: -1.185460090637207\n",
      "[134/200]: loss_d: -0.14360260963439941, loss_g: -1.1064825057983398\n",
      "[135/200]: loss_d: -0.1468934863805771, loss_g: -1.2447278499603271\n",
      "[136/200]: loss_d: -0.14536698162555695, loss_g: -1.0749598741531372\n",
      "[137/200]: loss_d: -0.14231526851654053, loss_g: -1.1249204874038696\n",
      "[138/200]: loss_d: -0.14575916528701782, loss_g: -1.0913492441177368\n",
      "[139/200]: loss_d: -0.1420053094625473, loss_g: -1.285581111907959\n",
      "[140/200]: loss_d: -0.14006473124027252, loss_g: -1.1828382015228271\n",
      "[141/200]: loss_d: -0.13757507503032684, loss_g: -1.1947505474090576\n",
      "[142/200]: loss_d: -0.1349903792142868, loss_g: -1.078037142753601\n",
      "[143/200]: loss_d: -0.13870806992053986, loss_g: -1.0589064359664917\n",
      "[144/200]: loss_d: -0.13703428208827972, loss_g: -1.0553168058395386\n",
      "[145/200]: loss_d: -0.13653358817100525, loss_g: -1.1867821216583252\n",
      "[146/200]: loss_d: -0.1344338357448578, loss_g: -1.1163616180419922\n",
      "[147/200]: loss_d: -0.1325366199016571, loss_g: -1.044023871421814\n",
      "[148/200]: loss_d: -0.12756088376045227, loss_g: -1.1590811014175415\n",
      "[149/200]: loss_d: -0.12753906846046448, loss_g: -0.9966200590133667\n",
      "[150/200]: loss_d: -0.12229419499635696, loss_g: -1.0879634618759155\n",
      "[151/200]: loss_d: -0.12267164140939713, loss_g: -1.0029494762420654\n",
      "[152/200]: loss_d: -0.1212911605834961, loss_g: -1.0202113389968872\n",
      "[153/200]: loss_d: -0.12437410652637482, loss_g: -1.0363487005233765\n",
      "[154/200]: loss_d: -0.12033559381961823, loss_g: -1.007324457168579\n",
      "[155/200]: loss_d: -0.11828111857175827, loss_g: -0.9568711519241333\n",
      "[156/200]: loss_d: -0.11689922958612442, loss_g: -1.0282025337219238\n",
      "[157/200]: loss_d: -0.11447485536336899, loss_g: -0.9406603574752808\n",
      "[158/200]: loss_d: -0.11478906124830246, loss_g: -0.891839325428009\n",
      "[159/200]: loss_d: -0.11041295528411865, loss_g: -0.9706825017929077\n",
      "[160/200]: loss_d: -0.1092565730214119, loss_g: -0.8620518445968628\n",
      "[161/200]: loss_d: -0.10565678030252457, loss_g: -0.8984176516532898\n",
      "[162/200]: loss_d: -0.10381276160478592, loss_g: -0.8152328133583069\n",
      "[163/200]: loss_d: -0.10366793721914291, loss_g: -0.8676297664642334\n",
      "[164/200]: loss_d: -0.10229404270648956, loss_g: -0.8273912668228149\n",
      "[165/200]: loss_d: -0.10162284970283508, loss_g: -0.8073791265487671\n",
      "[166/200]: loss_d: -0.10051461309194565, loss_g: -0.7905228137969971\n",
      "[167/200]: loss_d: -0.09542475640773773, loss_g: -0.8535277843475342\n",
      "[168/200]: loss_d: -0.0955493301153183, loss_g: -0.8680391311645508\n",
      "[169/200]: loss_d: -0.09154253453016281, loss_g: -0.7449524998664856\n",
      "[170/200]: loss_d: -0.09091130644083023, loss_g: -0.8520299792289734\n",
      "[171/200]: loss_d: -0.0892135500907898, loss_g: -0.8411678075790405\n",
      "[172/200]: loss_d: -0.08508837968111038, loss_g: -0.8764912486076355\n",
      "[173/200]: loss_d: -0.08403126895427704, loss_g: -0.9742245078086853\n",
      "[174/200]: loss_d: -0.08094018697738647, loss_g: -0.917218804359436\n",
      "[175/200]: loss_d: -0.07908578962087631, loss_g: -0.8271255493164062\n",
      "[176/200]: loss_d: -0.07745381444692612, loss_g: -0.7838048338890076\n",
      "[177/200]: loss_d: -0.07647013664245605, loss_g: -0.8191474676132202\n",
      "[178/200]: loss_d: -0.0737878680229187, loss_g: -0.7576418519020081\n",
      "[179/200]: loss_d: -0.07266302406787872, loss_g: -0.8713339567184448\n",
      "[180/200]: loss_d: -0.06998506188392639, loss_g: -0.8564190864562988\n",
      "[181/200]: loss_d: -0.06759339570999146, loss_g: -0.8954612612724304\n",
      "[182/200]: loss_d: -0.07410921156406403, loss_g: -0.9369412660598755\n",
      "[183/200]: loss_d: -0.07503842562437057, loss_g: -1.0562025308609009\n",
      "[184/200]: loss_d: -0.07292736321687698, loss_g: -0.8719084858894348\n",
      "[185/200]: loss_d: -0.07081755995750427, loss_g: -0.8920602202415466\n",
      "[186/200]: loss_d: -0.07137991487979889, loss_g: -0.8452862501144409\n",
      "[187/200]: loss_d: -0.07050447911024094, loss_g: -0.9130755662918091\n",
      "[188/200]: loss_d: -0.06921686977148056, loss_g: -0.9268960952758789\n",
      "[189/200]: loss_d: -0.06587444990873337, loss_g: -0.9831709265708923\n",
      "[190/200]: loss_d: -0.06528335064649582, loss_g: -0.9466082453727722\n",
      "[191/200]: loss_d: -0.06280789524316788, loss_g: -0.9640055298805237\n",
      "[192/200]: loss_d: -0.059845466166734695, loss_g: -0.8755797147750854\n",
      "[193/200]: loss_d: -0.05725548788905144, loss_g: -0.8030382394790649\n",
      "[194/200]: loss_d: -0.05895000323653221, loss_g: -0.841549277305603\n",
      "[195/200]: loss_d: -0.057324185967445374, loss_g: -0.9027705788612366\n",
      "[196/200]: loss_d: -0.05766267329454422, loss_g: -0.9260256886482239\n",
      "[197/200]: loss_d: -0.05571509152650833, loss_g: -0.8436309099197388\n",
      "[198/200]: loss_d: -0.0541885569691658, loss_g: -0.7947578430175781\n",
      "[199/200]: loss_d: -0.048824016004800797, loss_g: -0.8007060289382935\n"
     ]
    }
   ],
   "source": [
    "# Total number of epochs for Training\n",
    "n_epoch = 200\n",
    "\n",
    "losses = []\n",
    "\n",
    "for epoch in range(n_epoch):\n",
    "    D_losses, G_losses = [], []\n",
    "    # For Every Batch in the MNIST dataset\n",
    "    # We train the Discriminator First, then the Generator\n",
    "    for batch_idx, (mnist_input_data, _) in enumerate(train_loader):\n",
    "        D_losses.append(train_discriminator(mnist_input_data))\n",
    "\n",
    "        # Weight Clamping\n",
    "        for p in D.parameters():\n",
    "          p.data.clamp_(-0.01, 0.01)\n",
    "\n",
    "        if batch_idx % 2 == 0:\n",
    "          G_losses.append(train_generator())\n",
    "\n",
    "    if epoch % 10 == 0:\n",
    "        test_z = torch.randn(8, z_dim).to(device)\n",
    "        generated = G(test_z)\n",
    "        save_image(generated.view(generated.size(0), 1, 28, 28), f'./track/sample_images_{epoch}' + '.png')\n",
    "\n",
    "    # Logging the Loss values from Discriminator and Generator\n",
    "    loss_d = torch.mean(torch.FloatTensor(D_losses))\n",
    "    loss_g = torch.mean(torch.FloatTensor(G_losses))\n",
    "    losses.append((loss_d, loss_g))\n",
    "    print(f'[{epoch}/{n_epoch}]: loss_d: {loss_d}, loss_g: {loss_g}')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "-7judlTOS247"
   },
   "source": [
    "# Generating Images from our Trained Generator Network"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "id": "gxVOotx_oxeS"
   },
   "outputs": [],
   "source": [
    "with torch.no_grad():\n",
    "    test_z = torch.randn(8, z_dim).to(device)\n",
    "    generated = G(test_z)\n",
    "\n",
    "    save_image(generated.view(generated.size(0), 1, 28, 28), './track/sample_images_200' + '.png')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "id": "fbhmXPVx-vgR"
   },
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 448
    },
    "id": "WpZVI2Snuihl",
    "outputId": "1d5bcd00-6f4d-4b76-b9e7-7f7977a9b48e"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.image.AxesImage at 0x7b08c3b7ead0>"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.imshow(generated.view(generated.size(0), 1, 28, 28).cpu()[2].permute(1,2,0))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "OEPmb8tlSyU2"
   },
   "source": [
    "# Plotting Losses from the Training"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 430
    },
    "id": "ylatKU9TSI1s",
    "outputId": "d39ffcd5-5390-41c9-b204-d1e13da7a843"
   },
   "outputs": [
    {
     "data": {
      "image/png": "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1FScPHkSjz76KC677DLs2LEDKpWqV72HALBmzRqEhIR0KEt7y/to7fjgyGdoaWmp1f9VfpsrUfByjrrvvvtw8OBBWU8IAFmNOTMzE3FxcZg8eTJOnjyJvn37dvduOuWyyy4znx86dCiysrKQkpKCTz/9FAEBAR7cM/d49913cdlllyE+Pt58nTe/f+e6trY2XHfddRAEAW+++abstoULF5rPDx06FH5+frjrrruwcuVKr1hD54YbbjCfz8zMxNChQ9G3b19s3rwZkydP9uCeucd///tfzJ49G/7+/rLrveV9tHV86EmobGRDZGQkVCpVh07qsrIyxMbGemivXGPBggX47rvv8OuvvyIxMdHutllZWQCAEydOdMeuuZRWq8WAAQNw4sQJxMbGQq/Xo7a2VraNt76fp0+fxi+//II77rjD7nbe/P4BML839v4PY2NjOzTRt7e3o7q62mveWx64nD59Ghs2bJBlXazJyspCe3s78vPzu2cHXSwtLQ2RkZHmv8ve8B5yv/32G3Jzczv93wR65vto6/jgyGdobGys1f9VfpsrUfBig5+fH0aNGoWNGzearzMajdi4cSPGjRvnwT3rOkEQsGDBAqxbtw6bNm1Campqp/fJyckBAMTFxbl571yvoaEBJ0+eRFxcHEaNGgVfX1/Z+5mbm4uCggKvfD/fe+89REdHY/r06Xa38+b3DwBSU1MRGxsre990Oh127txpft/GjRuH2tpa7N2717zNpk2bYDQazcFbT8YDl+PHj+OXX35BREREp/fJycmBUqnsUGrxFmfOnEFVVZX579Lb30Opd999F6NGjcKwYcM63bYnvY+dHR8c+QwdN24cDhw4IAtEeTA+aNAgl+8wseGTTz4R1Gq1sHr1auHw4cPCnXfeKWi1WlkntTe55557BI1GI2zevFkoKSkx/zQ1NQmCIAgnTpwQnnrqKWHPnj1CXl6e8PXXXwtpaWnChRde6OE9d8yiRYuEzZs3C3l5ecK2bduE7OxsITIyUigvLxcEQRDuvvtuITk5Wdi0aZOwZ88eYdy4ccK4ceM8vNfOMxgMQnJysrBkyRLZ9d76/tXX1wv79+8X9u/fLwAQXnzxRWH//v3m0Tb/+te/BK1WK3z99dfCX3/9JcycOVNITU0VmpubzY8xdepUYcSIEcLOnTuF33//Xejfv79w4403euolydh7fXq9XrjiiiuExMREIScnR/Z/yUdnbN++XXjppZeEnJwc4eTJk8IHH3wgREVFCXPmzPHwKxPZe4319fXCI488IuzYsUPIy8sTfvnlF2HkyJFC//79hZaWFvNj9OT3UBA6/zsVBEGoq6sTAgMDhTfffLPD/Xv6+9jZ8UEQOv8MbW9vF4YMGSJceumlQk5OjrB+/XohKipKWLZsmcv3l4KXTrz66qtCcnKy4OfnJ4wZM0b4448/PL1LXQbA6s97770nCIIgFBQUCBdeeKEQHh4uqNVqoV+/fsLixYuFuro6z+64g66//nohLi5O8PPzExISEoTrr79eOHHihPn25uZm4d577xXCwsKEwMBA4corrxRKSko8uMdd89NPPwkAhNzcXNn13vr+/frrr1b/Lm+99VZBENhw6ccff1yIiYkR1Gq1MHny5A6vvaqqSrjxxhuF4OBgITQ0VLjtttuE+vp6D7yajuy9vry8PJv/l7/++qsgCIKwd+9eISsrS9BoNIK/v7+QkZEhPPPMM7IDv6fZe41NTU3CpZdeKkRFRQm+vr5CSkqKMH/+/A5fAnvyeygInf+dCoIg/N///Z8QEBAg1NbWdrh/T38fOzs+CIJjn6H5+fnCZZddJgQEBAiRkZHCokWLhLa2Npfvr8K004QQQgghXoF6XgghhBDiVSh4IYQQQohXoeCFEEIIIV6FghdCCCGEeBUKXgghhBDiVSh4IYQQQohXoeCFEEIIIV6FghdCCCGEeBUKXgghhBDiVSh4IYQQQohXoeCFEEIIIV7l/wHgVbp5+xRaMAAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(range(1, len(losses)+1), [_[0] for _ in losses], label='discriminator_loss')\n",
    "plt.plot(range(1, len(losses)+1), [_[1] for _ in losses], label='generator_loss')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "oICcnSSvSPUD"
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "accelerator": "GPU",
  "colab": {
   "gpuType": "V100",
   "machine_shape": "hm",
   "provenance": []
  },
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
